#include <iostream>
using namespace std;

const int N = 100010;
char op[2];
int p[N];
int n, m, a, b;

void init(int n) //初始化p数组，把每个数组独立作为一个集合定义
{
    for (int i = 0; i <= n; ++i)
        p[i] = i;
    return;
}

int find(int x)
{
    if (p[x] != x)         //如果x所在集合的祖宗结点不是他自己
        p[x] = find(p[x]); //那么x的父节点就等于他父节点的祖宗结点，简称路径压缩
    return p[x];
}

void merge(int a, int b)
{
    p[find(a)] = find(b); //a的祖宗结点认b的祖宗结点为父节点
    return;
}

bool query(int a, int b)
{
    return find(a) == find(b);
}

int main()
{
    scanf("%d%d", &n, &m);
    init(n);
    while (m--)
    {
        scanf("%s", op);
        if (op[0] == 'M')
        {
            scanf("%d%d", &a, &b);
            merge(a, b);
        }
        else
        {
            scanf("%d%d", &a, &b);
            if (query(a, b))
                printf("Yes\n");
            else
                printf("No\n");
        }
    }
    return 0;
}